package com.cai.io.homework;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

import java.io.*;
import java.util.*;

/**
 * 设计一个类:User
 * 里面有四个属性:String name,String pwd,String nick,int age
 * 定义get,set方法以及toString方法和构造方法
 * 当前程序启动后要求用户顺序输入以上四个信息
 * 然后实例化一个User对象保存着四个信息并将
 * 该对象序列化到文件中。
 * 文件名的命名规则:用户名.obj
 * 比如该用户输入用户名为张三，那么这个对象
 * 序列化后的文件名为:张三.obj
 * 提高(选做):
 * 可以在用户输入信息后做必要的格式验证，比如4个信息是否
 * 都输入内容了。不能有空的。
 * 用户名只能包含字母数字下划线，并且1-32位
 */
public class Test4 {
    static int count;//输入信息次数

    public static void main(String[] args) throws IOException {
        System.out.println("请输入四个用户以上的信息：");
        List<User> list = setUserInfo();
        serializableObj(list);
    }

    //录入信息
    public static List<User> setUserInfo() {
        Scanner sc = new Scanner(System.in);
        List<User> list = new ArrayList<>();
        boolean flag = true;
        while (flag) {
            for (int forCount = 0; forCount < 4; forCount++) {
                User user = new User();
                //用户名合法性判断
                System.out.println("请输入第" + (forCount + 1) + "位用户名");
                String name = sc.next();
                System.out.print("输入密码：");
                String pwd = sc.next();
                System.out.print("输入nick：");
                String nick = sc.next();
                System.out.print("输入年龄：");
                int age = sc.nextInt();
                //判断输入合法性
                boolean status1 = name.matches("[a-zA-Z0-9_]{1,32}");
                boolean status2 = pwd.trim().length() > 1;
                boolean status3 = nick.trim().length() > 1;
                boolean status4 = String.valueOf(age).trim().length() > 1;
                if (status1 && status2 && status3 && status4) {
                    user.setName(name);
                    user.setPwd(pwd);
                    user.setAge(age);
                    user.setNick(nick);
                    list.add(user);
                    System.out.println("信息录入成功");
                    count++;
                } else {
                    forCount--;
                    System.out.println("输入内容不规范");
                }
            }
            if (count >= 4) {
                flag = false;
            }
        }
        return list;
    }

    //序列化对象
    public static void serializableObj(List<User> list) throws IOException {
        ObjectOutputStream oos = null;
        for (int i = 0; i < list.size(); i++) {
            String name = list.get(i).getName();
            FileOutputStream fos = new FileOutputStream(name+".obj");
            oos=new ObjectOutputStream(fos);
            oos.writeObject(list.get(i));
        }
        System.out.println("写出完成");
        oos.close();
    }
}

@AllArgsConstructor //有参构造
@NoArgsConstructor //无参构造
@Data  //包含Setter和Getter方法
@ToString //包含toString()

class User implements Serializable {
    private String name;
    private String pwd;
    private String nick;
    private int age;
}
